﻿// 3104 Drying.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

/*

http://poj.org/problem?id=3104


烘干
时间限制：2000MS 内存限制：65536K
总提交量。41518 已接受。10118
说明

冬天洗衣服，尤其是晾衣服是很难的。但是简是一个非常聪明的女孩。她并不害怕这个无聊的过程。简决定使用一个散热器来使干燥更快。
但散热器很小，所以它一次只能容纳一件东西。

简希望在尽可能短的时间内进行干燥。她要求你写一个程序，计算一组给定的衣服的最小时间。

有n件衣服，简刚刚洗过。每件衣服在洗涤过程中都用了ai水。每分钟，每件衣服的含水量减少1（当然，只有在衣服还没有完全干的情况下）。
当所含水量为零时，布就会变干，可以打包了。

每分钟简可以选择一件东西在散热器上烘干。暖气片很热，所以这个东西里的水量在这一分钟内减少了k（但不能少于零--如果这个东西里的水少于k，结果的水量将是零）。

任务是通过有效地使用散热器来尽量减少干燥的总时间。当所有的衣服都干了，干燥过程就结束。

输入

第一行包含一个整数n（1≤n≤100 000）。第二行包含以空格分隔的ai（1≤ai≤109）。第三行包含k（1≤k≤109）。

输出

输出一个单一的整数--烘干所有衣服所需的最小可能的分钟数。

样本输入

样本输入 #1
3
2 3 9
5

样本输入 #2
3
2 3 6
5
样本输出

样本输出 #1
3

样本输出 #2
2
*/


const int N = 100010;
long long arr[N];
long long n, k;

bool check(long long m) {
	long long cost = 0;
	for (int i = 0; i < n; i++) {
		if (arr[i] > m) {
			int t = (arr[i] - m+k-2) / (k - 1);
			if (t > 0)cost += t;
		}
	}

	if (cost <= m) return true;
	return false;
}


int main()
{
	scanf("%lld", &n);
		for (int i = 0; i < n; i++) {
			scanf("%lld",&arr[i]);
		}
		scanf("%lld",&k);
		if (k == 1) {
			long long z = 0;
			for (int i = 0; i < n; i++) {
				z = max(z, arr[i]);
			}
			printf("%lld\n",z);
			return 0;
		}
		//所有衣服每分钟自然晾干1水分，所以烘烤的衣服实际是每分钟加速烘干了k-1的水分
		long long l = 1; int r = 1000000001;
		while (l < r) {
			long long mid = ( l + r) >> 1;
			if (check(mid)) {
				r = mid;
			}
			else {
				l = mid + 1;
			}
		}

		printf("%lld\n", l);

	return 0;
}
 